{admiral}PHUSE US Connect 2023
{admiral}https://www.cdisc.org/standards/foundational/adam/adamig-non-compartmental-analysis-input-data-v1-0
Example PK Curve with Parameters
PC and Dosing Records EXNote: I will be using terms ADNCA and ADPC interchangeably
| Variable | Variable Label |
|---|---|
| NFRLT | Nom. Rel. Time from Analyte First Dose |
| AFRLT | Act. Rel. Time from Analyte First Dose |
| NRRLT | Nominal Rel. Time from Ref. Dose |
| ARRLT | Actual Rel. Time from Ref. Dose |
| MRRLT | Modified Rel. Time from Ref. Dose |
Note: a relative time variable may refer to previous dose or next dose
DTYPE = “COPY” RecordsPCSEQ is Retained{admiral}{admiral}ADaM in R Asset Library
{admiral} is Open Source and Collaborative
{admiral} is Modular
{admiral} is Part of Pharmaverse
{admiral} is Open Source and Collaborative{admiral} Ecosystem
{admiral} is ModularNot One Large Function (e.g. create_adpc())
Multiple Coordinated Functions
{admiral} is Part of Pharmaverse{admiral} updates for PK(March 6, 2023 release 0.10.0)
New ad_adpc.R Template
New PK Programming Vignette
Updates to create_single_dose_dataset() function
Read in Data
Expand Dosing Records
Find First Dose and Calculate First Datetime
Find Reference Dose Dates Corresponding to PK Records
Combine PC and EX Records and Derive Relative Time Variables
Derive Analysis Variables
Create Duplicated Records for Analysis
Combine ADPC data with Duplicated Records
Calculate Baseline and Change from Baseline
Assign ASEQ
Add Additional Baseline Variables
Add ADSL variables
Add Labels and Attributes
{admiral} LibrariesPC Rawdata# A tibble: 14 × 6
USUBJID PCTEST PCDTC VISIT PCTPT PCSTRESN
<chr> <chr> <chr> <chr> <chr> <dbl>
1 01-701-1028 XANOMELINE 2013-07-18T23:30:00 BASELINE Pre-dose 0
2 01-701-1028 XANOMELINE 2013-07-19T00:05:00 BASELINE 5 Min Post-dose 0.102
3 01-701-1028 XANOMELINE 2013-07-19T00:30:00 BASELINE 30 Min Post-dose 0.547
4 01-701-1028 XANOMELINE 2013-07-19T01:00:00 BASELINE 1h Post-dose 0.925
5 01-701-1028 XANOMELINE 2013-07-19T01:30:00 BASELINE 1.5h Post-dose 1.19
6 01-701-1028 XANOMELINE 2013-07-19T02:00:00 BASELINE 2h Post-dose 1.37
7 01-701-1028 XANOMELINE 2013-07-19T04:00:00 BASELINE 4h Post-dose 1.68
8 01-701-1028 XANOMELINE 2013-07-19T06:00:00 BASELINE 6h Post-dose 1.76
9 01-701-1028 XANOMELINE 2013-07-19T08:00:00 BASELINE 8h Post-dose 1.77
10 01-701-1028 XANOMELINE 2013-07-19T12:00:00 BASELINE 12h Post-dose 0.495
11 01-701-1028 XANOMELINE 2013-07-19T16:00:00 BASELINE 16h Post-dose 0.138
12 01-701-1028 XANOMELINE 2013-07-20T00:00:00 BASELINE 24h Post-dose 0.0107
13 01-701-1028 XANOMELINE 2013-07-20T12:00:00 BASELINE 36h Post-dose NA
14 01-701-1028 XANOMELINE 2013-07-21T00:00:00 BASELINE 48h Post-dose NA
This CDISC test PC data has concentrations over 48 hours from a daily patch
ADSL with PCderive_vars_merged()derive_vars_dtm()
derive_vars_dtm_to_dt()
derive_vars_dtm_to_tm()
derive_vars_dy()
NFRLT for PC data based on PCTPTNUMPC Merge Codeadsl_vars <- exprs(TRTSDT, TRTSDTM, TRT01P, TRT01A)
adpc <- pc %>%
# Join ADSL with PC (need TRTSDT for ADY derivation)
derive_vars_merged(
dataset_add = adsl,
new_vars = adsl_vars,
by_vars = exprs(STUDYID, USUBJID)
) %>%
# Calculate ADTM, ADT, ADY
derive_vars_dtm(
new_vars_prefix = "A",
dtc = PCDTC,
time_imputation = "00:00:00"
) %>%
# Derive dates and times from date/times
derive_vars_dtm_to_dt(exprs(ADTM)) %>%
derive_vars_dtm_to_tm(exprs(ADTM)) %>%
derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT)) %>%
# Derive event ID and nominal relative time from first dose (NFRLT)
mutate(
EVID = 0,
DRUG = PCTEST,
NFRLT = if_else(PCTPTNUM < 0, 0, PCTPTNUM), .after = USUBJID
)PC Merge Code Output# A tibble: 14 × 6
USUBJID PCTEST ADTM VISIT PCTPT NFRLT
<chr> <chr> <dttm> <chr> <chr> <dbl>
1 01-701-1028 XANOMELINE 2013-07-18 23:30:00 BASELINE Pre-dose 0
2 01-701-1028 XANOMELINE 2013-07-19 00:05:00 BASELINE 5 Min Post-dose 0.08
3 01-701-1028 XANOMELINE 2013-07-19 00:30:00 BASELINE 30 Min Post-dose 0.5
4 01-701-1028 XANOMELINE 2013-07-19 01:00:00 BASELINE 1h Post-dose 1
5 01-701-1028 XANOMELINE 2013-07-19 01:30:00 BASELINE 1.5h Post-dose 1.5
6 01-701-1028 XANOMELINE 2013-07-19 02:00:00 BASELINE 2h Post-dose 2
7 01-701-1028 XANOMELINE 2013-07-19 04:00:00 BASELINE 4h Post-dose 4
8 01-701-1028 XANOMELINE 2013-07-19 06:00:00 BASELINE 6h Post-dose 6
9 01-701-1028 XANOMELINE 2013-07-19 08:00:00 BASELINE 8h Post-dose 8
10 01-701-1028 XANOMELINE 2013-07-19 12:00:00 BASELINE 12h Post-dose 12
11 01-701-1028 XANOMELINE 2013-07-19 16:00:00 BASELINE 16h Post-dose 16
12 01-701-1028 XANOMELINE 2013-07-20 00:00:00 BASELINE 24h Post-dose 24
13 01-701-1028 XANOMELINE 2013-07-20 12:00:00 BASELINE 36h Post-dose 36
14 01-701-1028 XANOMELINE 2013-07-21 00:00:00 BASELINE 48h Post-dose 48
Note numeric datetimes and Nominal Relative Time from Analyte First Dose (NFRLT)
EX Rawdata# A tibble: 3 × 7
USUBJID EXTRT EXDOSFRQ EXSTDTC EXENDTC VISIT VISITDY
<chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 01-701-1028 XANOMELINE QD 2013-07-19 2013-08-01 BASELINE 1
2 01-701-1028 XANOMELINE QD 2013-08-02 2014-01-06 WEEK 2 14
3 01-701-1028 XANOMELINE QD 2014-01-07 2014-01-14 WEEK 24 168
This CDISC test exposure data is for a daily patch
ADSL with EXderive_vars_merged()derive_vars_dtm()
derive_vars_dtm_to_dt()
NFRLT based on VISITDYEX Merge Code#|
# ---- Get dosing information ----
ex <- ex %>%
derive_vars_merged(
dataset_add = adsl,
new_vars = adsl_vars,
by_vars = exprs(STUDYID, USUBJID)
) %>%
# Keep records with nonzero dose
filter(EXDOSE > 0) %>%
# Add time and set missing end date to start date
# Impute missing time to 00:00:00
# Derive Analysis Start and End Dates
derive_vars_dtm(
new_vars_prefix = "AST",
dtc = EXSTDTC,
time_imputation = "00:00:00"
) %>%
derive_vars_dtm(
new_vars_prefix = "AEN",
dtc = EXENDTC,
time_imputation = "00:00:00"
) %>%
# Derive event ID and nominal relative time from first dose (NFRLT)
mutate(
EVID = 1,
NFRLT = 24 * (VISITDY - 1), .after = USUBJID
) %>%
# Set missing end dates to start date
mutate(AENDTM = case_when(
is.na(AENDTM) ~ ASTDTM,
TRUE ~ AENDTM
)) %>%
# Derive dates from date/times
derive_vars_dtm_to_dt(exprs(ASTDTM)) %>%
derive_vars_dtm_to_dt(exprs(AENDTM))EX Merge Output# A tibble: 3 × 7
USUBJID EXTRT EXDOSFRQ ASTDT AENDT VISITDY NFRLT
<chr> <chr> <chr> <date> <date> <dbl> <dbl>
1 01-701-1028 XANOMELINE QD 2013-07-19 2013-08-01 1 0
2 01-701-1028 XANOMELINE QD 2013-08-02 2014-01-06 14 312
3 01-701-1028 XANOMELINE QD 2014-01-07 2014-01-14 168 4008
Note numeric dates and Nominal Relative Time from Analyte First Dose (NFRLT)
create_single_dose_dataset()NFRLTEXDOSFRQ = “QD” will expand NFRLT by 24 hours# ---- Expand dosing records between start and end dates ----
ex_exp <- ex %>%
create_single_dose_dataset(
dose_freq = EXDOSFRQ,
start_date = ASTDT,
start_datetime = ASTDTM,
end_date = AENDT,
end_datetime = AENDTM,
nominal_time = NFRLT,
lookup_table = dose_freq_lookup,
lookup_column = CDISC_VALUE,
keep_source_vars = exprs(
STUDYID, USUBJID, EVID, EXDOSFRQ, EXDOSFRM,
NFRLT, EXDOSE, EXDOSU, EXTRT, ASTDT, ASTDTM, AENDT, AENDTM,
VISIT, VISITNUM, VISITDY,
TRT01A, TRT01P, DOMAIN, EXSEQ, !!!adsl_vars
)
) %>%
# Derive AVISIT based on nominal relative time
mutate(
AVISITN = NFRLT %/% 24 + 1,
AVISIT = paste("Day", AVISITN),
ADTM = ASTDTM,
DRUG = EXTRT,
) %>%
# Derive dates and times from datetimes
derive_vars_dtm_to_dt(exprs(ADTM)) %>%
derive_vars_dtm_to_tm(exprs(ADTM)) %>%
derive_vars_dtm_to_tm(exprs(ASTDTM)) %>%
derive_vars_dtm_to_tm(exprs(AENDTM)) %>%
derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))# A tibble: 20 × 6
USUBJID DRUG EXDOSFRQ ASTDT AVISIT NFRLT
<chr> <chr> <chr> <date> <chr> <dbl>
1 01-701-1028 XANOMELINE ONCE 2013-07-19 Day 1 0
2 01-701-1028 XANOMELINE ONCE 2013-07-20 Day 2 24
3 01-701-1028 XANOMELINE ONCE 2013-07-21 Day 3 48
4 01-701-1028 XANOMELINE ONCE 2013-07-22 Day 4 72
5 01-701-1028 XANOMELINE ONCE 2013-07-23 Day 5 96
6 01-701-1028 XANOMELINE ONCE 2013-07-24 Day 6 120
7 01-701-1028 XANOMELINE ONCE 2013-07-25 Day 7 144
8 01-701-1028 XANOMELINE ONCE 2013-07-26 Day 8 168
9 01-701-1028 XANOMELINE ONCE 2013-07-27 Day 9 192
10 01-701-1028 XANOMELINE ONCE 2013-07-28 Day 10 216
11 01-701-1028 XANOMELINE ONCE 2013-07-29 Day 11 240
12 01-701-1028 XANOMELINE ONCE 2013-07-30 Day 12 264
13 01-701-1028 XANOMELINE ONCE 2013-07-31 Day 13 288
14 01-701-1028 XANOMELINE ONCE 2013-08-01 Day 14 312
15 01-701-1028 XANOMELINE ONCE 2013-08-02 Day 14 312
16 01-701-1028 XANOMELINE ONCE 2013-08-03 Day 15 336
17 01-701-1028 XANOMELINE ONCE 2013-08-04 Day 16 360
18 01-701-1028 XANOMELINE ONCE 2013-08-05 Day 17 384
19 01-701-1028 XANOMELINE ONCE 2013-08-06 Day 18 408
20 01-701-1028 XANOMELINE ONCE 2013-08-07 Day 19 432
Note: NFRLT is expanded by 24 hours for each record AVISIT has values “Day 1”, “Day 2”, “Day 3”, etc.
FANLDTMderive_vars_merged()new_vars used to derive FANLDTMAVISIT and AVISITN based on NFRLT for this studyFANLDTM = First Datetime of Dose for Analyte
# ---- Find first dose per treatment per subject ----
# ---- Join with ADPC data and keep only subjects with dosing ----
adpc <- adpc %>%
derive_vars_merged(
dataset_add = ex_exp,
filter_add = (EXDOSE > 0 & !is.na(ADTM)),
new_vars = exprs(FANLDTM = ADTM),
order = exprs(ADTM, EXSEQ),
mode = "first",
by_vars = exprs(STUDYID, USUBJID, DRUG)
) %>%
filter(!is.na(FANLDTM)) %>%
# Derive AVISIT from nominal relative time
mutate(
AVISITN = NFRLT %/% 24 + 1,
AVISIT = paste("Day", AVISITN),
)# A tibble: 14 × 5
USUBJID FANLDTM AVISIT ADTM PCTPT
<chr> <dttm> <chr> <dttm> <chr>
1 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-18 23:30:00 Pre-dose
2 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 00:05:00 5 Min Post-dose
3 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 00:30:00 30 Min Post-dose
4 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 01:00:00 1h Post-dose
5 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 01:30:00 1.5h Post-dose
6 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 02:00:00 2h Post-dose
7 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 04:00:00 4h Post-dose
8 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 06:00:00 6h Post-dose
9 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 08:00:00 8h Post-dose
10 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 12:00:00 12h Post-dose
11 01-701-1028 2013-07-19 00:00:00 Day 1 2013-07-19 16:00:00 16h Post-dose
12 01-701-1028 2013-07-19 00:00:00 Day 2 2013-07-20 00:00:00 24h Post-dose
13 01-701-1028 2013-07-19 00:00:00 Day 2 2013-07-20 12:00:00 36h Post-dose
14 01-701-1028 2013-07-19 00:00:00 Day 3 2013-07-21 00:00:00 48h Post-dose
FANLDTM = First Datetime of Dose for Analyte
derive_vars_joined()filter_join used to set condition# ---- Find previous dose ----
# Use derive_vars_joined() for consistency with other variables
# This is equivalent to derive_vars_last_dose() in this case
adpc <- adpc %>%
derive_vars_joined(
dataset_add = ex_exp,
by_vars = exprs(USUBJID),
order = exprs(ADTM),
new_vars = exprs(
ADTM_prev = ADTM, EXDOSE_prev = EXDOSE, AVISIT_prev = AVISIT,
AENDTM_prev = AENDTM
),
join_vars = exprs(ADTM),
join_type = "all",
filter_add = NULL,
filter_join = ADTM > ADTM.join,
mode = "last",
check_type = "none"
)# A tibble: 14 × 6
USUBJID VISIT ADTM PCTPT ADTM_prev AVISIT_prev
<chr> <chr> <dttm> <chr> <dttm> <chr>
1 01-701-1028 BASELI… 2013-07-18 23:30:00 Pre-… NA <NA>
2 01-701-1028 BASELI… 2013-07-19 00:05:00 5 Mi… 2013-07-19 00:00:00 Day 1
3 01-701-1028 BASELI… 2013-07-19 00:30:00 30 M… 2013-07-19 00:00:00 Day 1
4 01-701-1028 BASELI… 2013-07-19 01:00:00 1h P… 2013-07-19 00:00:00 Day 1
5 01-701-1028 BASELI… 2013-07-19 01:30:00 1.5h… 2013-07-19 00:00:00 Day 1
6 01-701-1028 BASELI… 2013-07-19 02:00:00 2h P… 2013-07-19 00:00:00 Day 1
7 01-701-1028 BASELI… 2013-07-19 04:00:00 4h P… 2013-07-19 00:00:00 Day 1
8 01-701-1028 BASELI… 2013-07-19 06:00:00 6h P… 2013-07-19 00:00:00 Day 1
9 01-701-1028 BASELI… 2013-07-19 08:00:00 8h P… 2013-07-19 00:00:00 Day 1
10 01-701-1028 BASELI… 2013-07-19 12:00:00 12h … 2013-07-19 00:00:00 Day 1
11 01-701-1028 BASELI… 2013-07-19 16:00:00 16h … 2013-07-19 00:00:00 Day 1
12 01-701-1028 BASELI… 2013-07-20 00:00:00 24h … 2013-07-19 00:00:00 Day 1
13 01-701-1028 BASELI… 2013-07-20 12:00:00 36h … 2013-07-20 00:00:00 Day 2
14 01-701-1028 BASELI… 2013-07-21 00:00:00 48h … 2013-07-20 00:00:00 Day 2
ADTM_prev is the datetime of the previous dose AVISIT_prev is the analysis visit of the previous dose
# ---- Find next dose ----
adpc <- adpc %>%
derive_vars_joined(
dataset_add = ex_exp,
by_vars = exprs(USUBJID),
order = exprs(ADTM),
new_vars = exprs(
ADTM_next = ADTM, EXDOSE_next = EXDOSE, AVISIT_next = AVISIT,
AENDTM_next = AENDTM
),
join_vars = exprs(ADTM),
join_type = "all",
filter_add = NULL,
filter_join = ADTM <= ADTM.join,
mode = "first",
check_type = "none"
)# A tibble: 14 × 6
USUBJID VISIT ADTM PCTPT ADTM_next AVISIT_next
<chr> <chr> <dttm> <chr> <dttm> <chr>
1 01-701-1028 BASELI… 2013-07-18 23:30:00 Pre-… 2013-07-19 00:00:00 Day 1
2 01-701-1028 BASELI… 2013-07-19 00:05:00 5 Mi… 2013-07-20 00:00:00 Day 2
3 01-701-1028 BASELI… 2013-07-19 00:30:00 30 M… 2013-07-20 00:00:00 Day 2
4 01-701-1028 BASELI… 2013-07-19 01:00:00 1h P… 2013-07-20 00:00:00 Day 2
5 01-701-1028 BASELI… 2013-07-19 01:30:00 1.5h… 2013-07-20 00:00:00 Day 2
6 01-701-1028 BASELI… 2013-07-19 02:00:00 2h P… 2013-07-20 00:00:00 Day 2
7 01-701-1028 BASELI… 2013-07-19 04:00:00 4h P… 2013-07-20 00:00:00 Day 2
8 01-701-1028 BASELI… 2013-07-19 06:00:00 6h P… 2013-07-20 00:00:00 Day 2
9 01-701-1028 BASELI… 2013-07-19 08:00:00 8h P… 2013-07-20 00:00:00 Day 2
10 01-701-1028 BASELI… 2013-07-19 12:00:00 12h … 2013-07-20 00:00:00 Day 2
11 01-701-1028 BASELI… 2013-07-19 16:00:00 16h … 2013-07-20 00:00:00 Day 2
12 01-701-1028 BASELI… 2013-07-20 00:00:00 24h … 2013-07-20 00:00:00 Day 2
13 01-701-1028 BASELI… 2013-07-20 12:00:00 36h … 2013-07-21 00:00:00 Day 3
14 01-701-1028 BASELI… 2013-07-21 00:00:00 48h … 2013-07-21 00:00:00 Day 3
ADTM_next is the datetime of the next dose
# ---- Find previous nominal time ----
adpc <- adpc %>%
derive_vars_joined(
dataset_add = ex_exp,
by_vars = exprs(USUBJID),
order = exprs(NFRLT),
new_vars = exprs(NFRLT_prev = NFRLT),
join_vars = exprs(NFRLT),
join_type = "all",
filter_add = NULL,
filter_join = NFRLT > NFRLT.join,
mode = "last",
check_type = "none"
)# ---- Find next nominal time ----
adpc <- adpc %>%
derive_vars_joined(
dataset_add = ex_exp,
by_vars = exprs(USUBJID),
order = exprs(NFRLT),
new_vars = exprs(NFRLT_next = NFRLT),
join_vars = exprs(NFRLT),
join_type = "all",
filter_add = NULL,
filter_join = NFRLT <= NFRLT.join,
mode = "first",
check_type = "none"
)# A tibble: 14 × 5
USUBJID NFRLT PCTPT NFRLT_prev NFRLT_next
<chr> <dbl> <chr> <dbl> <dbl>
1 01-701-1028 0 Pre-dose NA 0
2 01-701-1028 0.08 5 Min Post-dose 0 24
3 01-701-1028 0.5 30 Min Post-dose 0 24
4 01-701-1028 1 1h Post-dose 0 24
5 01-701-1028 1.5 1.5h Post-dose 0 24
6 01-701-1028 2 2h Post-dose 0 24
7 01-701-1028 4 4h Post-dose 0 24
8 01-701-1028 6 6h Post-dose 0 24
9 01-701-1028 8 8h Post-dose 0 24
10 01-701-1028 12 12h Post-dose 0 24
11 01-701-1028 16 16h Post-dose 0 24
12 01-701-1028 24 24h Post-dose 0 24
13 01-701-1028 36 36h Post-dose 24 48
14 01-701-1028 48 48h Post-dose 24 48
NFRLT_prev is the nominal relative time from the previous dose NFRLT_next is the nominal relative time for the next dose
derive_vars_duration()AFRLT# ---- Combine ADPC and EX data ----
# Derive Relative Time Variables
adpc <- bind_rows(adpc, ex_exp) %>%
group_by(USUBJID, DRUG) %>%
mutate(
FANLDTM = min(FANLDTM, na.rm = TRUE),
min_NFRLT = min(NFRLT_prev, na.rm = TRUE),
maxdate = max(ADT[EVID == 0], na.rm = TRUE), .after = USUBJID
) %>%
arrange(USUBJID, ADTM) %>%
ungroup() %>%
filter(ADT <= maxdate) %>%
# Derive Actual Relative Time from First Dose (AFRLT)
derive_vars_duration(
new_var = AFRLT,
start_date = FANLDTM,
end_date = ADTM,
out_unit = "hours",
floor_in = FALSE,
add_one = FALSE
) %>%
# Derive Actual Relative Time from Reference Dose (ARRLT)
derive_vars_duration(
new_var = ARRLT,
start_date = ADTM_prev,
end_date = ADTM,
out_unit = "hours",
floor_in = FALSE,
add_one = FALSE
) %>%
# Derive Actual Relative Time from Next Dose (AXRLT not kept)
derive_vars_duration(
new_var = AXRLT,
start_date = ADTM_next,
end_date = ADTM,
out_unit = "hours",
floor_in = FALSE,
add_one = FALSE
) %>%
mutate(
ARRLT = case_when(
EVID == 1 ~ 0,
is.na(ARRLT) ~ AXRLT,
TRUE ~ ARRLT
),
# Derive Reference Dose Date
PCRFTDTM = case_when(
EVID == 1 ~ ADTM,
is.na(ADTM_prev) ~ ADTM_next,
TRUE ~ ADTM_prev
)
) %>%
# Derive dates and times from datetimes
derive_vars_dtm_to_dt(exprs(FANLDTM)) %>%
derive_vars_dtm_to_tm(exprs(FANLDTM)) %>%
derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
derive_vars_dtm_to_tm(exprs(PCRFTDTM))# A tibble: 17 × 7
USUBJID FANLDT AVISIT PCTPT AFRLT ARRLT AXRLT
<chr> <date> <chr> <chr> <dbl> <dbl> <dbl>
1 01-701-1028 2013-07-19 Day 1 Pre-dose -0.5 -0.5 -0.5
2 01-701-1028 2013-07-19 Day 1 <NA> 0 0 NA
3 01-701-1028 2013-07-19 Day 1 5 Min Post-dose 0.0833 0.0833 -23.9
4 01-701-1028 2013-07-19 Day 1 30 Min Post-dose 0.5 0.5 -23.5
5 01-701-1028 2013-07-19 Day 1 1h Post-dose 1 1 -23
6 01-701-1028 2013-07-19 Day 1 1.5h Post-dose 1.5 1.5 -22.5
7 01-701-1028 2013-07-19 Day 1 2h Post-dose 2 2 -22
8 01-701-1028 2013-07-19 Day 1 4h Post-dose 4 4 -20
9 01-701-1028 2013-07-19 Day 1 6h Post-dose 6 6 -18
10 01-701-1028 2013-07-19 Day 1 8h Post-dose 8 8 -16
11 01-701-1028 2013-07-19 Day 1 12h Post-dose 12 12 -12
12 01-701-1028 2013-07-19 Day 1 16h Post-dose 16 16 -8
13 01-701-1028 2013-07-19 Day 2 24h Post-dose 24 24 0
14 01-701-1028 2013-07-19 Day 2 <NA> 24 0 NA
15 01-701-1028 2013-07-19 Day 2 36h Post-dose 36 12 -12
16 01-701-1028 2013-07-19 Day 3 48h Post-dose 48 24 0
17 01-701-1028 2013-07-19 Day 3 <NA> 48 0 NA
AFRLT = Actual Relative Time from Analyte First Dose ARRLT = Actual Relative Time from Reference Dose
# A tibble: 17 × 6
USUBJID AVISIT PCTPT NFRLT NRRLT NXRLT
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 01-701-1028 Day 1 Pre-dose 0 0 0
2 01-701-1028 Day 1 <NA> 0 0 0
3 01-701-1028 Day 1 5 Min Post-dose 0.08 0.08 -23.9
4 01-701-1028 Day 1 30 Min Post-dose 0.5 0.5 -23.5
5 01-701-1028 Day 1 1h Post-dose 1 1 -23
6 01-701-1028 Day 1 1.5h Post-dose 1.5 1.5 -22.5
7 01-701-1028 Day 1 2h Post-dose 2 2 -22
8 01-701-1028 Day 1 4h Post-dose 4 4 -20
9 01-701-1028 Day 1 6h Post-dose 6 6 -18
10 01-701-1028 Day 1 8h Post-dose 8 8 -16
11 01-701-1028 Day 1 12h Post-dose 12 12 -12
12 01-701-1028 Day 1 16h Post-dose 16 16 -8
13 01-701-1028 Day 2 24h Post-dose 24 24 0
14 01-701-1028 Day 2 <NA> 24 0 0
15 01-701-1028 Day 2 36h Post-dose 36 12 -12
16 01-701-1028 Day 3 48h Post-dose 48 24 0
17 01-701-1028 Day 3 <NA> 48 0 0
NFRLT = Nominal Relative Time from Analyte First Dose NRRLT = Nominal Relative Time from Reference Dose
adpc <- adpc %>%
mutate(
ATPTN = case_when(
EVID == 1 ~ 0,
TRUE ~ PCTPTNUM
),
ATPT = case_when(
EVID == 1 ~ "Dose",
TRUE ~ PCTPT
),
ATPTREF = case_when(
EVID == 1 ~ AVISIT,
is.na(AVISIT_prev) ~ AVISIT_next,
TRUE ~ AVISIT_prev
),
# Derive baseline flag for pre-dose records
ABLFL = case_when(
ATPT == "Pre-dose" ~ "Y",
TRUE ~ NA_character_
),
# Derive BASETYPE
BASETYPE = paste(ATPTREF, "Baseline"),
# Derive Actual Dose
DOSEA = case_when(
EVID == 1 ~ EXDOSE,
is.na(EXDOSE_prev) ~ EXDOSE_next,
TRUE ~ EXDOSE_prev
),
# Derive Planned Dose
DOSEP = case_when(
TRT01P == "Xanomeline High Dose" ~ 81,
TRT01P == "Xanomeline Low Dose" ~ 54
),
DOSEU = "mg",
) %>%
mutate(
FRLTU = "h",
RRLTU = "h",
PARAMCD = coalesce(PCTESTCD, "DOSE"),
ALLOQ = PCLLOQ,
AVAL = case_when(
EVID == 1 ~ EXDOSE,
PCSTRESC == "<BLQ" & NFRLT == 0 ~ 0,
PCSTRESC == "<BLQ" & NFRLT > 0 ~ 0.5 * ALLOQ,
TRUE ~ PCSTRESN
),
AVALU = case_when(
EVID == 1 ~ EXDOSU,
TRUE ~ PCSTRESU
),
AVALCAT1 = if_else(PCSTRESC == "<BLQ", PCSTRESC, prettyNum(signif(AVAL, digits = 3))),
) %>%
# Add SRCSEQ
mutate(
SRCDOM = DOMAIN,
SRCVAR = "SEQ",
SRCSEQ = coalesce(PCSEQ, EXSEQ)
)# A tibble: 17 × 8
USUBJID NFRLT AVISIT ATPT ABLFL ATPTREF AVAL AVALCAT1
<chr> <dbl> <chr> <chr> <chr> <chr> <dbl> <chr>
1 01-701-1028 0 Day 1 Pre-dose Y Day 1 0 <BLQ
2 01-701-1028 0 Day 1 Dose <NA> Day 1 54 <NA>
3 01-701-1028 0.08 Day 1 5 Min Post-dose <NA> Day 1 0.102 0.102
4 01-701-1028 0.5 Day 1 30 Min Post-dose <NA> Day 1 0.547 0.547
5 01-701-1028 1 Day 1 1h Post-dose <NA> Day 1 0.925 0.925
6 01-701-1028 1.5 Day 1 1.5h Post-dose <NA> Day 1 1.19 1.19
7 01-701-1028 2 Day 1 2h Post-dose <NA> Day 1 1.37 1.37
8 01-701-1028 4 Day 1 4h Post-dose <NA> Day 1 1.68 1.68
9 01-701-1028 6 Day 1 6h Post-dose <NA> Day 1 1.76 1.76
10 01-701-1028 8 Day 1 8h Post-dose <NA> Day 1 1.77 1.77
11 01-701-1028 12 Day 1 12h Post-dose <NA> Day 1 0.495 0.495
12 01-701-1028 16 Day 1 16h Post-dose <NA> Day 1 0.138 0.138
13 01-701-1028 24 Day 2 24h Post-dose <NA> Day 1 0.0107 0.0107
14 01-701-1028 24 Day 2 Dose <NA> Day 2 54 <NA>
15 01-701-1028 36 Day 2 36h Post-dose <NA> Day 2 0.005 <BLQ
16 01-701-1028 48 Day 3 48h Post-dose <NA> Day 2 0.005 <BLQ
17 01-701-1028 48 Day 3 Dose <NA> Day 3 54 <NA>
ATPT Analysis Timepoint ATPTREF Analysis Timepoint Reference AVAL Analysis Value
DTYPE = “COPY” RecordsPCSEQ is retainedABLFL is set to “Y”# ---- Create DTYPE copy records ----
dtype <- adpc %>%
filter(NFRLT > 0 & NXRLT == 0 & EVID == 0 & !is.na(AVISIT_next)) %>%
select(-PCRFTDT, -PCRFTTM) %>%
# Re-derive variables in for DTYPE copy records
mutate(
ABLFL = NA_character_,
ATPTREF = AVISIT_next,
ARRLT = AXRLT,
NRRLT = NXRLT,
PCRFTDTM = ADTM_next,
DOSEA = EXDOSE_next,
BASETYPE = paste(AVISIT_next, "Baseline"),
ATPT = "Pre-dose",
ATPTN = NFRLT,
ABLFL = "Y",
DTYPE = "COPY"
) %>%
derive_vars_dtm_to_dt(exprs(PCRFTDTM)) %>%
derive_vars_dtm_to_tm(exprs(PCRFTDTM))# A tibble: 2 × 8
USUBJID DTYPE BASETYPE ATPT NFRLT NRRLT AFRLT ARRLT
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 01-701-1028 COPY Day 2 Baseline Pre-dose 24 0 24 0
2 01-701-1028 COPY Day 3 Baseline Pre-dose 48 0 48 0
Note that NRRLT and ARRLT equal zero for next dose
ADPC data with Duplicated RecordsADPC Output# A tibble: 19 × 5
USUBJID BASETYPE ATPT DTYPE ARRLT
<chr> <chr> <chr> <chr> <dbl>
1 01-701-1028 Day 1 Baseline Pre-dose <NA> -0.5
2 01-701-1028 Day 1 Baseline Dose <NA> 0
3 01-701-1028 Day 1 Baseline 5 Min Post-dose <NA> 0.0833
4 01-701-1028 Day 1 Baseline 30 Min Post-dose <NA> 0.5
5 01-701-1028 Day 1 Baseline 1h Post-dose <NA> 1
6 01-701-1028 Day 1 Baseline 1.5h Post-dose <NA> 1.5
7 01-701-1028 Day 1 Baseline 2h Post-dose <NA> 2
8 01-701-1028 Day 1 Baseline 4h Post-dose <NA> 4
9 01-701-1028 Day 1 Baseline 6h Post-dose <NA> 6
10 01-701-1028 Day 1 Baseline 8h Post-dose <NA> 8
11 01-701-1028 Day 1 Baseline 12h Post-dose <NA> 12
12 01-701-1028 Day 1 Baseline 16h Post-dose <NA> 16
13 01-701-1028 Day 1 Baseline 24h Post-dose <NA> 24
14 01-701-1028 Day 2 Baseline Dose <NA> 0
15 01-701-1028 Day 2 Baseline Pre-dose COPY 0
16 01-701-1028 Day 2 Baseline 36h Post-dose <NA> 12
17 01-701-1028 Day 2 Baseline 48h Post-dose <NA> 24
18 01-701-1028 Day 3 Baseline Dose <NA> 0
19 01-701-1028 Day 3 Baseline Pre-dose COPY 0
Use functions derive_var_base() and derive_var_chg()
# A tibble: 19 × 10
USUBJID BASETYPE DTYPE AVISIT ATPT AVAL NRRLT ARRLT BASE CHG
<chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 01-701-10… Day 1 B… <NA> Day 1 Pre-… 0 0 -0.5 0 0
2 01-701-10… Day 1 B… <NA> Day 1 Dose 54 0 0 NA NA
3 01-701-10… Day 1 B… <NA> Day 1 5 Mi… 0.102 0.08 0.0833 0 0.102
4 01-701-10… Day 1 B… <NA> Day 1 30 M… 0.547 0.5 0.5 0 0.547
5 01-701-10… Day 1 B… <NA> Day 1 1h P… 0.925 1 1 0 0.925
6 01-701-10… Day 1 B… <NA> Day 1 1.5h… 1.19 1.5 1.5 0 1.19
7 01-701-10… Day 1 B… <NA> Day 1 2h P… 1.37 2 2 0 1.37
8 01-701-10… Day 1 B… <NA> Day 1 4h P… 1.68 4 4 0 1.68
9 01-701-10… Day 1 B… <NA> Day 1 6h P… 1.76 6 6 0 1.76
10 01-701-10… Day 1 B… <NA> Day 1 8h P… 1.77 8 8 0 1.77
11 01-701-10… Day 1 B… <NA> Day 1 12h … 0.495 12 12 0 0.495
12 01-701-10… Day 1 B… <NA> Day 1 16h … 0.138 16 16 0 0.138
13 01-701-10… Day 1 B… <NA> Day 2 24h … 0.0107 24 24 0 0.0107
14 01-701-10… Day 2 B… <NA> Day 2 Dose 54 0 0 NA NA
15 01-701-10… Day 2 B… COPY Day 2 Pre-… 0.0107 0 0 0.0107 0
16 01-701-10… Day 2 B… <NA> Day 2 36h … 0.005 12 12 0.0107 -0.00571
17 01-701-10… Day 2 B… <NA> Day 3 48h … 0.005 24 24 0.0107 -0.00571
18 01-701-10… Day 3 B… <NA> Day 3 Dose 54 0 0 NA NA
19 01-701-10… Day 3 B… COPY Day 3 Pre-… 0.005 0 0 0.005 0
ASEQ# ---- Add ASEQ ----
adpc <- adpc %>%
# Calculate ASEQ
derive_var_obs_number(
new_var = ASEQ,
by_vars = exprs(STUDYID, USUBJID),
order = exprs(ADTM, BASETYPE, EVID, AVISITN, ATPTN, DTYPE),
check_type = "error"
) %>%
# Remove temporary variables
select(
-DOMAIN, -PCSEQ, -starts_with("orig"), -starts_with("min"),
-starts_with("max"), -starts_with("EX"), -ends_with("next"),
-ends_with("prev"), -DRUG, -EVID, -AXRLT, -NXRLT, -VISITDY
) %>%
# Derive PARAM and PARAMN
derive_vars_merged(dataset_add = select(param_lookup, -PCTESTCD), by_vars = exprs(PARAMCD))Use function derive_var_obs_number()
ASEQ Ouput# A tibble: 19 × 11
USUBJID BASETYPE DTYPE AVISIT ATPT AVAL NFRLT NRRLT AFRLT ARRLT ASEQ
<chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 01-701… Day 1 B… <NA> Day 1 Pre-… 0 0 0 -0.5 -0.5 1
2 01-701… Day 1 B… <NA> Day 1 Dose 54 0 0 0 0 2
3 01-701… Day 1 B… <NA> Day 1 5 Mi… 0.102 0.08 0.08 0.0833 0.0833 3
4 01-701… Day 1 B… <NA> Day 1 30 M… 0.547 0.5 0.5 0.5 0.5 4
5 01-701… Day 1 B… <NA> Day 1 1h P… 0.925 1 1 1 1 5
6 01-701… Day 1 B… <NA> Day 1 1.5h… 1.19 1.5 1.5 1.5 1.5 6
7 01-701… Day 1 B… <NA> Day 1 2h P… 1.37 2 2 2 2 7
8 01-701… Day 1 B… <NA> Day 1 4h P… 1.68 4 4 4 4 8
9 01-701… Day 1 B… <NA> Day 1 6h P… 1.76 6 6 6 6 9
10 01-701… Day 1 B… <NA> Day 1 8h P… 1.77 8 8 8 8 10
11 01-701… Day 1 B… <NA> Day 1 12h … 0.495 12 12 12 12 11
12 01-701… Day 1 B… <NA> Day 1 16h … 0.138 16 16 16 16 12
13 01-701… Day 1 B… <NA> Day 2 24h … 0.0107 24 24 24 24 13
14 01-701… Day 2 B… COPY Day 2 Pre-… 0.0107 24 0 24 0 14
15 01-701… Day 2 B… <NA> Day 2 Dose 54 24 0 24 0 15
16 01-701… Day 2 B… <NA> Day 2 36h … 0.005 36 12 36 12 16
17 01-701… Day 2 B… <NA> Day 3 48h … 0.005 48 24 48 24 17
18 01-701… Day 3 B… COPY Day 3 Pre-… 0.005 48 0 48 0 18
19 01-701… Day 3 B… <NA> Day 3 Dose 54 48 0 48 0 19
VSHTBL and weight WTBLcompute_bmi()# Derive additional baselines from VS
adpc <- adpc %>%
derive_vars_merged(
dataset_add = vs,
filter_add = VSTESTCD == "HEIGHT",
by_vars = exprs(STUDYID, USUBJID),
new_vars = exprs(HTBL = VSSTRESN, HTBLU = VSSTRESU)
) %>%
derive_vars_merged(
dataset_add = vs,
filter_add = VSTESTCD == "WEIGHT" & VSBLFL == "Y",
by_vars = exprs(STUDYID, USUBJID),
new_vars = exprs(WTBL = VSSTRESN, WTBLU = VSSTRESU)
) %>%
mutate(
BMIBL = compute_bmi(height = HTBL, weight = WTBL),
BMIBLU = "kg/m^2"
)Use derive_vars_merged() function
# A tibble: 19 × 10
USUBJID HTBL HTBLU WTBL WTBLU BMIBL BMIBLU BASETYPE ATPT AVAL
<chr> <dbl> <chr> <dbl> <chr> <dbl> <chr> <chr> <chr> <dbl>
1 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline Pre-… 0
2 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline Dose 54
3 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 5 Mi… 0.102
4 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 30 M… 0.547
5 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 1h P… 0.925
6 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 1.5h… 1.19
7 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 2h P… 1.37
8 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 4h P… 1.68
9 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 6h P… 1.76
10 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 8h P… 1.77
11 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 12h … 0.495
12 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 16h … 0.138
13 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 1 Baseline 24h … 0.0107
14 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 2 Baseline Pre-… 0.0107
15 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 2 Baseline Dose 54
16 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 2 Baseline 36h … 0.005
17 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 2 Baseline 48h … 0.005
18 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 3 Baseline Pre-… 0.005
19 01-701-1028 178. cm 99.3 kg 31.4 kg/m^2 Day 3 Baseline Dose 54
ADSL variablesUse derive_vars_merged() function
ADPC ad_adpc.R
Call use_ad_template("adpc")
{admiral} Functionality is Suitable for PK Data ProgrammingADPPK{admiral} Team